.\" -*- nroff -*-
.\" Copyright (c) 2015      University of Houston.  All rights reserved.
.\" Copyright (c) 2015      Mellanox Technologies, Inc.
.\" $COPYRIGHT$
.de Vb
.ft CW
.nf
..
.de Ve
.ft R

.fi
..
.TH "SHMEM\\_CSWAP" "3" "#OMPI_DATE#" "#PACKAGE_VERSION#" "#PACKAGE_NAME#"
.SH NAME

\fIshmem_int_cswap\fP(3),
\fIshmem_int4_cswap\fP(3),
\fIshmem_int8_cswap\fP(3),
\fIshmem_long_cswap\fP(3),
\fIshmem_longlong_cswap\fP(3)
\- Performs an atomic conditional swap to a remote data object
.SH SYNOPSIS

C or C++:
.Vb
#include <mpp/shmem.h>

int shmem_int_cswap(int *target, int cond, int value, int pe);

long shmem_long_cswap(long *target, long cond, long value,
  int pe);

long long shmem_longlong_cswap(longlong *target,
  longlong cond, longlong value, int pe);
.Ve
Fortran:
.Vb
INCLUDE "mpp/shmem.fh"

INTEGER pe

INTEGER(KIND=4) SHMEM_INT4_CSWAP
ires = SHMEM_INT4_CSWAP(target, cond, value, pe)

INTEGER(KIND=8) SHMEM_INT8_CSWAP
ires = SHMEM_INT8_CSWAP(target, cond, value, pe)
.Ve
.SH DESCRIPTION

The conditional swap routines conditionally update a target data object on an arbitrary
processing element (PE) and return the prior contents of the data object in one atomic
operation.
.PP
The arguments are as follows:
.TP
target
The remotely accessible integer data object to be updated on the remote PE. If
you are using C/C++, the type of target should match that implied in the SYNOPSIS section. If
you are using the Fortran compiler, it must be of type integer with an element size of 4 bytes
for SHMEM_INT4_ADD and 8 bytes for SHMEM_INT8_ADD.
.TP
value
The value to be atomically added to target. If you are using C/C++, the type of
value should match that implied in the SYNOPSIS section. If you are using Fortran, it must be
of type integer with an element size of target.
.TP
pe
An integer that indicates the PE number upon which target is to be updated. If you
are using Fortran, it must be a default integer value.
.TP
target
The remotely accessible integer data object to be updated on the remote PE. If
you are using C/C++, the data type of target should match that implied in the SYNOPSIS
section. If you are using Fortran, it must be of the following type:
.RS
.TP
\fBSHMEM_INT4_CSWAP\fP: 4\-byte integer
.TP
\fBSHMEM_INT8_CSWAP\fP: 8\-byte integer
.RE
.RS
.PP
.RE
.TP
cond
cond is compared to the remote target value. If cond and the remote target are
equal, then value is swapped into the remote target. Otherwise, the remote target is
unchanged. In either case, the old value of the remote target is returned as the function return
value. cond must be of the same data type as target.
.TP
value
The value to be atomically written to the remote PE. value must be the same data
type as target.
.TP
pe
An integer that indicates the PE number upon which target is to be updated. If you
are using Fortran, it must be a default integer value.
.PP
.SH NOTES

The term remotely accessible is defined in \fIintro_shmem\fP(3)\&.
.SH RETURN VALUES

The contents that had been in the target data object on the remote PE prior to the conditional
swap.
.SH EXAMPLES

The following call ensures that the first PE to execute the conditional swap will successfully
write its PE number to race_winner on PE 0.
.Vb
main()
{
  static int race_winner = \-1;
  int oldval;

  shmem_init();
  oldval = shmem_int_cswap(&race_winner, \-1, shmem_my_pe(), 0);
  if (oldval == \-1)
    printf("pe %d was first\\n",shmem_my_pe());
}
.Ve
.SH SEE ALSO

\fIintro_shmem\fP(3),
\fIshmem_cache\fP(3),
\fIshmem_swap\fP(3)
